import { fileURLToPath, URL } from 'node:url';
import { defineConfig, loadEnv } from 'vite';
import type { UserConfig, ConfigEnv } from 'vite';
import externalGlobals from 'rollup-plugin-external-globals';
import vue from '@vitejs/plugin-vue';
import vueJsx from '@vitejs/plugin-vue-jsx';
import vueDevTools from 'vite-plugin-vue-devtools';
import AutoImport from 'unplugin-auto-import/vite';
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';
import IconsResolver from 'unplugin-icons/resolver';
import Icons from 'unplugin-icons/vite';
import Components from 'unplugin-vue-components/vite';
import { viteMockServe } from 'vite-plugin-mock';
import vueSetupExtend from 'vite-plugin-vue-setup-extend';
import { visualizer } from 'rollup-plugin-visualizer'; // setup 组件name命名插件
import ViteCompression from 'vite-plugin-compression';
// import { createHtmlPlugin } from 'vite-plugin-html';
// const globals = externalGlobals({
//     moment: 'moment',
//     'video.js': 'videojs',
//     jspdf: 'jspdf',
//     xlsx: 'XLSX',
//     echart: 'echart'
// });

export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
    // 获取当前工作目录
    const root = process.cwd();
    console.log(root, '....');
    // 获取当前环境信息
    const env = loadEnv(mode, root);
    console.log(env, '当前环境env', import.meta.url);
    return {
        // 根目录
        root,
        // 项目部署基础路径
        base: '/',
        // 静态资源无需处理
        publicDir: fileURLToPath(new URL('./public', import.meta.url)),
        // 需要处理的静态资源
        assetsInclude: fileURLToPath(new URL('./src/assets', import.meta.url)),
        // 插件
        plugins: [
            // createHtmlPlugin({
            //     inject: {
            //         data: {
            //             monentscript:
            //                 '<script src="https://cdn.jsdelivr.net/npm/moment@2.29.1/min/moment.js"></script>',
            //             videoscript:
            //                 '<script src="https://cdn.jsdelivr.net/npm/video.js@7.14.3/dist/video.min.js"></script>',
            //             echartscript: '<script src="https://cdn.jsdelivr.net/npm/echarts@5.2.1/echarts"></script>',
            //             jspdfscript: '<script src="https://cdn.jsdelivr.net/npm/jspdf@2.5.1/dist/pdf.js"></script>',
            //             xlsxscript:
            //                 '<script src="https://cdn.jsdelivr.net/npm/xlsx@0.17.4/dist/xlsx.full.min.js"></script>'
            //         }
            //     }
            // }),
            vue(),
            vueJsx(),
            vueDevTools(),
            ViteCompression({
                threshold: 1024 * 20, // 超过20kb才进行压缩
                ext: '.gz', // 压缩后缀
                algorithm: 'gzip' // 压缩算法
            }),
            // 自动导入组件
            AutoImport({
                // 指定需要自动导入的项目
                imports: ['vue', 'vue-router', 'pinia'],
                // eslint忽略检查
                eslintrc: {
                    enabled: true
                },
                resolvers: [ElementPlusResolver(), IconsResolver({ prefix: 'Icon' })],
                dts: fileURLToPath(new URL('./types/auto-imports.d.ts', import.meta.url))
            }),
            // 自动注册组件
            Components({
                resolvers: [ElementPlusResolver(), IconsResolver({ enabledCollections: ['ep'] })],
                dts: fileURLToPath(new URL('./types/components.d.ts', import.meta.url))
            }),
            Icons({
                autoInstall: true
            }),
            viteMockServe({
                mockPath: 'mock', // 数据模拟需要拦截的请求起始 URL
                localEnabled: true, // 本地开发是否启用
                prodEnabled: false // 生产模式是否启用
            }),
            vueSetupExtend()
        ],

        css: {
            // css预处理器
            preprocessorOptions: {
                scss: {
                    additionalData: '@use "@/styles/global.scss" as *;'
                }
            }
        },
        server: {
            // 是否开启https
            // https: false,
            // 指定服务器应该监听哪个 IP 地址。 如果将此设置为 0.0.0.0 或者 true 将监听所有地址，包括局域网和公网地址。
            host: true,
            // 开发环境预览服务器端口
            port: 9001,
            // 启动后是否自动打开浏览器
            open: false,
            // 是否开启CORS跨域
            cors: true,
            // 代理服务器
            // 帮助我们开发时解决跨域问题
            proxy: {
                // 这里的意思是 以/api开头发送的请求都会被转发到 http://xxx:9000
                [env.VITE_APP_API_BASEURL]: {
                    target: 'http://192.168.100.89:18888/api',
                    // 改变 Host Header
                    changeOrigin: true,
                    // 发起请求时将 '/api' 替换为 ''
                    rewrite: (path) => path.replace(/^\/api/, '')
                }
                // [env.VITE_APP_MOCK_BASEURL]: {
                //     target: 'http://localhost:9001',
                //     // 改变 Host Header
                //     changeOrigin: true
                //     // 发起请求时将 '/api' 替换为 ''
                //     //rewrite: (path) => path.replace(/^\/api/, ""),
                // }
            }
        },
        // 打包配置
        build: {
            // 关闭 sorcemap 报错不会映射到源码
            sourcemap: false,
            // 打包大小超出 400kb 提示警告
            chunkSizeWarningLimit: 400,
            rollupOptions: {
                // 打包入口文件 根目录下的 index.html
                // 也就是项目从哪个文件开始打包
                input: {
                    index: fileURLToPath(new URL('./index.html', import.meta.url))
                },
                experimentalLogSideEffects: true, //打印合并chunk有副作用的函数
                external: ['moment', 'video.js', 'jspdf', 'xlsx', 'echart'], // 不需要打包的插件
                // plugins: [visualizer({ open: true }), globals],
                plugins: [visualizer({ open: true })],
                // 静态资源分类打包
                output: {
                    experimentalMinChunkSize: 20 * 1024,
                    manualChunks: (id: string) => {
                        if (id.includes('node_modules')) {
                            return 'vendor';
                        }
                        return 'index';
                    },
                    chunkFileNames: 'static/js/[name]-[hash].js',
                    entryFileNames: 'static/js/[name]-[hash].js',
                    assetFileNames: 'static/[ext]/[name]-[hash].[ext]'
                }
            }
        },
        resolve: {
            alias: {
                '@': fileURLToPath(new URL('./src', import.meta.url)),
                '#': fileURLToPath(new URL('./types', import.meta.url))
            }
        }
    };
});
